package com.itheima.reggie.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itheima.reggie.common.R;
import com.itheima.reggie.dto.SetmealDto;
import com.itheima.reggie.entity.Category;
import com.itheima.reggie.entity.Setmeal;
import com.itheima.reggie.entity.SetmealDish;
import com.itheima.reggie.service.CategoryService;
import com.itheima.reggie.service.SetmealDishService;
import com.itheima.reggie.service.SetmealService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.context.annotation.Bean;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.List;

/**
 * @author ：石破天
 * @date ：Created in 2022年11月20日
 * @description ：
 * @version: 1.0
 */
@Slf4j
@RestController
@RequestMapping("/setmeal")
public class SetmealController {

    @Autowired
    private SetmealService setmealService;
    //  setmealService  它的方法是直接查询数据库的

    @PostMapping
    @CacheEvict(value = "setmealCache",allEntries = true)//只能全删
    public R<String> save(@RequestBody SetmealDto setmealDto){
        log.info("添加的套餐及套餐菜品关联信息为:{}",setmealDto);

//        setmealService.save() mp自带的方法只能保存到一张表
        //无法实现我们的需求  自己写方法
        setmealService.saveWithDish(setmealDto);

        return R.success("新增套餐成功");

    }

    @Autowired
    private CategoryService categoryService;

    @GetMapping("/page")
    public R<Page> page(int page, int pageSize, String name){
        // 分页套路是什么
        // 1 分页构造器
        Page<Setmeal> pageInfo = new Page<>(page, pageSize);
        // 2: 条件构造器
        LambdaQueryWrapper<Setmeal> wrapper = new LambdaQueryWrapper<>();

        // 3: 添加条件
        wrapper.like(StringUtils.isNotEmpty(name),Setmeal::getName,name);
        //   name like  ?
        //更新时间排序
        wrapper.orderByDesc(Setmeal::getUpdateTime);
        // 4: 执行
        setmealService.page(pageInfo,wrapper);

        // Page<Setmeal> --List<Setmeal> records
         //                     Setmeal  --里面没有categoryName属性
        //   所以导致  页面看不到分类名称

        // Page<SetmealDto>--List<SetmealDto> records
        //                     SetmealDto  --里面有categoryName属性
       Page<SetmealDto> dtoPage = new Page<>();
       // pageInfo 所有属性===>复制给  setmealDtoPage
        //     records除外 因为 就是这里不一样的
        BeanUtils.copyProperties(pageInfo,dtoPage,"records");
        // 构建一个  存储 Dto的集合
        List<SetmealDto> records = new ArrayList<>();
        // 因为 dtoPage 里面的 list集合是 没有数据的 需要先构建出来
        // 构建集合内容
        //  集合内容无法直接查询数据库
        List<Setmeal> setmealList = pageInfo.getRecords();
        // setmealList 就是之前展示在页面中的列表数据
        //  列表数据中的每个对象 没有 categoryName属性
        // list集合里面 setmeal==>转换成 setmealDto对象....
        // 存到 records集合中
        for (Setmeal setmeal : setmealList) {
            //创建一个 新的 setmealDto
            SetmealDto setmealDto = new SetmealDto();
            // 对象属性copy
            BeanUtils.copyProperties(setmeal,setmealDto);
            // 加 一个属性
            // categortName
            Long categoryId = setmeal.getCategoryId();
            // 根据id查询  category对象  需要 categoryService
            Category category = categoryService.getById(categoryId);
            setmealDto.setCategoryName(category.getName());
            // 把包装好的  setmealDto 放到  records盒子里面
            records.add(setmealDto);
        }


        //集合内容构建成功---集合内容就是 当前页展示的 套餐及套餐相关数据
        dtoPage.setRecords(records);
        // 5: 返回
        return R.success(dtoPage);

    }


//    @DeleteMapping
//    public R<String> delete(Long[] ids){
//
//        return R.success("删除成功");
//    }
   //  用集合接收 必须要加 @RequestParam
    @DeleteMapping
    @CacheEvict(value = "setmealCache",allEntries = true)//只能全删
    public R<String> delete(@RequestParam List<Long> ids){

        // 那么要删除  什么?呢
        // 仅仅删除套餐吗 ????  要删除套餐菜品关系????
        // 吃了我的给我吐出来
        //  删除 该套餐 以及 套餐与菜品的 关系
        ///  去两个表中删除.... setmeal setmeal_dish
//        setmealService.removeByIds();//原始的方法 只能删除一个表
      //创建一个方法
          setmealService.removeWithDish(ids);

        return R.success("删除成功");
    }

    /**
     *  用户看的套餐数据
     *     有高并发
     * @param setmeal
     * @return
     */
    @GetMapping("/list")
    @Cacheable(value = "setmealCache",key = "#setmeal.categoryId")
    // 把返回值数据 写到缓存中 要求R必须能序列化 序列化到 redis中
    public R<List<Setmeal>> list(Setmeal setmeal){
        log.info("setmeal是接收参数用:"+setmeal);

        // select * from setmeal where category_id=? and status=1
        LambdaQueryWrapper<Setmeal> wrapper = new LambdaQueryWrapper<>();
        // where category_id=?
        wrapper.eq(setmeal.getCategoryId()!=null,Setmeal::getCategoryId,setmeal.getCategoryId());
               // 先判断 后拼接
        // and status=1
        wrapper.eq(Setmeal::getStatus,setmeal.getStatus());
        // 根据时间倒序...写不写都无所谓
        //查询
        List<Setmeal> setmealList = setmealService.list(wrapper);


    return R.success(setmealList);
    }
}
